// 默认利用axios的cancelToken进行防重复提交。
// 如需允许多个提交同时发出。则需要在请求配置config中增加 neverCancel 属性，并设置为true
import qs from 'qs'
import axios from 'axios'
import { getToken, setToken } from '@/service/cookie'
import { logout } from '@/api'
import { Dialog, Toast } from 'vant'
import router from '@/router'
// const url:any = import.meta.env.VITE_API_BASEURL

/* 防止重复提交，利用axios的cancelToken */
// let pending: any[] = [] // 声明一个数组用于存储每个ajax请求的取消函数和ajax标识
// const CancelToken: any = axios.CancelToken

// const removePending: any = (config: any, f: any) => {
//   // 获取请求的url
//   const flagUrl = config.url
//   // 判断该请求是否在请求队列中
//   if (pending.indexOf(flagUrl) !== -1) {
//     // 如果在请求中，并存在f,f即axios提供的取消函数
//     if (f) {
//       f('取消重复请求') // 执行取消操作
//     } else {
//       pending.splice(pending.indexOf(flagUrl), 1) // 把这条记录从数组中移除
//     }
//   } else {
//     // 如果不存在在请求队列中，加入队列
//     if (f) {
//       pending.push(flagUrl)
//     }
//   }
// }

/* 创建axios实例 */
const service = axios.create({
  baseURL: import.meta.env.VITE_API_BASEURL,
  timeout: 500000, // 请求超时时间
  headers: {
    // crossDomain: true, // 跨域
    'Content-Type': 'application/x-www-form-urlencoded'
    // "Content-Type": "application/json",
    // "Authorization": "Bearer " + sessionStorage.getItem("token")
  }
})

/* request拦截器 */
service.interceptors.request.use((config: any) => {
  // neverCancel 配置项，允许多个请求
  // if (!config.neverCancel) {
  //   // 生成cancelToken
  //   config.cancelToken = new CancelToken((c: any) => {
  //     removePending(config, c)
  //   })
  // }
  // 在这里可以统一修改请求头，例如 加入 用户 token 等操作
  // multipart/form-data
  const token = getToken('token')
  if (token) {
    config.headers.authorization = `${token}`// 让每个请求携带token--['X-Token']为自定义key
  }
  if (
    config.data &&
    config.headers['Content-Type'] === 'application/x-www-form-urlencoded'
  ) {
    config.data = qs.stringify(config.data) // eslint-disable-line no-param-reassign
  }
  return config
}, (error: any) => {
  Promise.reject(error)
})

/* respone拦截器 */
service.interceptors.response.use(
  (response: any) => {
    // 移除队列中的该请求，注意这时候没有传第二个参数f
    // removePending(response.config)
    // 获取返回数据，并处理。按自己业务需求修改。
    const {
      data: { code, msg, data }
    } = response
    if (code === 1) {
      return data
    } else if (code === 203) {
      return response.data
    } else if (code === -400 || code === -401) {
      // 原有的逻辑

      // Dialog.confirm({
      //   title: '温馨提示',
      //   message: '您需要登录后才能进行该操作哦',
      //   confirmButtonText: '马上登录',
      //   cancelButtonText: '稍后再说'
      // })
      //   .then(() => {
      //     setToken('token', '')
      //     setToken('bindId', '')
      //     // router.replace('/login')
      //     console.log('window.location.href', window.location.href)
      //     console.log('window.location.href.includes("/find/activity")', window.location.href.includes('/find/activity'))
      //     if (window.location.href.includes('/find/activity')) {
      //       sessionStorage.setItem('goBackUrl', window.location.href)
      //       router.replace(`/login?goBackUrl=${window.location.href}`)
      //     } else if (window.location.href.includes('/find/actCheIn')) {
      //       sessionStorage.setItem('goBackUrl', window.location.href)
      //       router.replace(`/login?goBackUrl=${window.location.href}`)
      //     } else {
      //       router.replace('/login')
      //     }
      //   })
      setToken('token', '')
      setToken('bindId', '')
      console.log('window.location.href', window.location.href)
      console.log('window.location.href.includes("/find/activity")', window.location.href.includes('/find/activity'))
      if (window.location.href.includes('/find/activity')) {
        sessionStorage.setItem('goBackUrl', window.location.href)
        router.replace(`/login?goBackUrl=${window.location.href}`)
      } else if (window.location.href.includes('/find/actCheIn')) {
        sessionStorage.setItem('goBackUrl', window.location.href)
        router.replace(`/login?goBackUrl=${window.location.href}`)
      } else {
        router.replace('/login')
      }
      throw new Error(msg)
    } else if (code === -511 || code === -512) {
      router.replace('/followUs')
    } else if (code === -513 || code === -515) {
      logout().then(res => {
        setToken('token', '')
        setToken('bindId', '')
        router.replace('/login')
      })
      // router.replace('/login')
    } else if (code === -514) {
      Dialog.alert({
        title: '温馨提示',
        message: '当前用户已在其它地方登录',
        confirmButtonText: '马上登录',
        cancelButtonText: '稍后再说'
      })
        .then(() => {
          logout().then(res => {
            setToken('token', '')
            setToken('bindId', '')
            router.replace('/login')
          })
        })
    } else if (code === 0 || code === -411) {
      console.log('msg', msg)
      Toast(msg)
      throw new Error(msg)
    }
  },
  (error: any) => {
    // 异常处理
    // pending = []
    if (error.message === '取消重复请求') {
      return Promise.reject(error)
    }
    return Promise.reject(error)
  }
)

export default service
